home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / doom / axxwar_1.zip / SOURCES / BOSS.QC < prev    next >
Text File  |  1997-02-26  |  13KB  |  388 lines

  1. // AxxWars 0.8
  2. /*
  3. ==============================================================================
  4.  
  5. BOSS-ONE
  6.  
  7. ==============================================================================
  8. */
  9. $cd id1/models/boss1
  10. $origin 0 0 -15
  11. $base base
  12. $skin skin
  13. $scale 5
  14.  
  15. $frame rise1 rise2 rise3 rise4 rise5 rise6 rise7 rise8 rise9 rise10
  16. $frame rise11 rise12 rise13 rise14 rise15 rise16 rise17 
  17.  
  18. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8
  19. $frame walk9 walk10 walk11 walk12 walk13 walk14 walk15
  20. $frame walk16 walk17 walk18 walk19 walk20 walk21 walk22
  21. $frame walk23 walk24 walk25 walk26 walk27 walk28 walk29 walk30 walk31
  22.  
  23. $frame death1 death2 death3 death4 death5 death6 death7 death8 death9
  24.  
  25. $frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8
  26. $frame attack9 attack10 attack11 attack12 attack13 attack14 attack15
  27. $frame attack16 attack17 attack18 attack19 attack20 attack21 attack22
  28. $frame attack23
  29.  
  30. $frame shocka1 shocka2 shocka3 shocka4 shocka5 shocka6 shocka7 shocka8
  31. $frame shocka9 shocka10 
  32.  
  33. $frame shockb1 shockb2 shockb3 shockb4 shockb5 shockb6
  34.  
  35. $frame shockc1 shockc2 shockc3 shockc4 shockc5 shockc6 shockc7 shockc8 
  36. $frame shockc9 shockc10
  37.  
  38.  
  39. void(vector p) boss_missile;
  40.  
  41. void() boss_face =
  42. {
  43.     
  44. // go for another player if multi player
  45.     if (self.enemy.health <= 0 || random() < 0.02)
  46.     {
  47.         self.enemy = find(self.enemy, classname, "player");
  48.         if (!self.enemy)
  49.             self.enemy = find(self.enemy, classname, "player");
  50.     }
  51.     ai_face();
  52. };
  53.  
  54. void() boss_rise1    =[    $rise1, boss_rise2 ] {
  55. sound (self, CHAN_WEAPON, "boss1/out1.wav", 1, ATTN_NORM);
  56. };
  57. void() boss_rise2    =[    $rise2, boss_rise3 ] {
  58. sound (self, CHAN_VOICE, "boss1/sight1.wav", 1, ATTN_NORM);
  59. };
  60. void() boss_rise3    =[    $rise3, boss_rise4 ] {};
  61. void() boss_rise4    =[    $rise4, boss_rise5 ] {};
  62. void() boss_rise5    =[    $rise5, boss_rise6 ] {};
  63. void() boss_rise6    =[    $rise6, boss_rise7 ] {};
  64. void() boss_rise7    =[    $rise7, boss_rise8 ] {};
  65. void() boss_rise8    =[    $rise8, boss_rise9 ] {};
  66. void() boss_rise9    =[    $rise9, boss_rise10 ] {};
  67. void() boss_rise10    =[    $rise10, boss_rise11 ] {};
  68. void() boss_rise11    =[    $rise11, boss_rise12 ] {};
  69. void() boss_rise12    =[    $rise12, boss_rise13 ] {};
  70. void() boss_rise13    =[    $rise13, boss_rise14 ] {};
  71. void() boss_rise14    =[    $rise14, boss_rise15 ] {};
  72. void() boss_rise15    =[    $rise15, boss_rise16 ] {};
  73. void() boss_rise16    =[    $rise16, boss_rise17 ] {};
  74. void() boss_rise17    =[    $rise17, boss_missile1 ] {};
  75.  
  76. void() boss_idle1    =[    $walk1, boss_idle2 ]
  77. {
  78. // look for other players
  79. };
  80. void() boss_idle2    =[    $walk2, boss_idle3 ] {boss_face();};
  81. void() boss_idle3    =[    $walk3, boss_idle4 ] {boss_face();};
  82. void() boss_idle4    =[    $walk4, boss_idle5 ] {boss_face();};
  83. void() boss_idle5    =[    $walk5, boss_idle6 ] {boss_face();};
  84. void() boss_idle6    =[    $walk6, boss_idle7 ] {boss_face();};
  85. void() boss_idle7    =[    $walk7, boss_idle8 ] {boss_face();};
  86. void() boss_idle8    =[    $walk8, boss_idle9 ] {boss_face();};
  87. void() boss_idle9    =[    $walk9, boss_idle10 ] {boss_face();};
  88. void() boss_idle10    =[    $walk10, boss_idle11 ] {boss_face();};
  89. void() boss_idle11    =[    $walk11, boss_idle12 ] {boss_face();};
  90. void() boss_idle12    =[    $walk12, boss_idle13 ] {boss_face();};
  91. void() boss_idle13    =[    $walk13, boss_idle14 ] {boss_face();};
  92. void() boss_idle14    =[    $walk14, boss_idle15 ] {boss_face();};
  93. void() boss_idle15    =[    $walk15, boss_idle16 ] {boss_face();};
  94. void() boss_idle16    =[    $walk16, boss_idle17 ] {boss_face();};
  95. void() boss_idle17    =[    $walk17, boss_idle18 ] {boss_face();};
  96. void() boss_idle18    =[    $walk18, boss_idle19 ] {boss_face();};
  97. void() boss_idle19    =[    $walk19, boss_idle20 ] {boss_face();};
  98. void() boss_idle20    =[    $walk20, boss_idle21 ] {boss_face();};
  99. void() boss_idle21    =[    $walk21, boss_idle22 ] {boss_face();};
  100. void() boss_idle22    =[    $walk22, boss_idle23 ] {boss_face();};
  101. void() boss_idle23    =[    $walk23, boss_idle24 ] {boss_face();};
  102. void() boss_idle24    =[    $walk24, boss_idle25 ] {boss_face();};
  103. void() boss_idle25    =[    $walk25, boss_idle26 ] {boss_face();};
  104. void() boss_idle26    =[    $walk26, boss_idle27 ] {boss_face();};
  105. void() boss_idle27    =[    $walk27, boss_idle28 ] {boss_face();};
  106. void() boss_idle28    =[    $walk28, boss_idle29 ] {boss_face();};
  107. void() boss_idle29    =[    $walk29, boss_idle30 ] {boss_face();};
  108. void() boss_idle30    =[    $walk30, boss_idle31 ] {boss_face();};
  109. void() boss_idle31    =[    $walk31, boss_idle1 ] {boss_face();};
  110.  
  111. void() boss_missile1    =[    $attack1, boss_missile2 ] {boss_face();};
  112. void() boss_missile2    =[    $attack2, boss_missile3 ] {boss_face();};
  113. void() boss_missile3    =[    $attack3, boss_missile4 ] {boss_face();};
  114. void() boss_missile4    =[    $attack4, boss_missile5 ] {boss_face();};
  115. void() boss_missile5    =[    $attack5, boss_missile6 ] {boss_face();};
  116. void() boss_missile6    =[    $attack6, boss_missile7 ] {boss_face();};
  117. void() boss_missile7    =[    $attack7, boss_missile8 ] {boss_face();};
  118. void() boss_missile8    =[    $attack8, boss_missile9 ] {boss_face();};
  119. void() boss_missile9    =[    $attack9, boss_missile10 ] {boss_missile('100 100 200');};
  120. void() boss_missile10    =[    $attack10, boss_missile11 ] {boss_face();};
  121. void() boss_missile11    =[    $attack11, boss_missile12 ] {boss_face();};
  122. void() boss_missile12    =[    $attack12, boss_missile13 ] {boss_face();};
  123. void() boss_missile13    =[    $attack13, boss_missile14 ] {boss_face();};
  124. void() boss_missile14    =[    $attack14, boss_missile15 ] {boss_face();};
  125. void() boss_missile15    =[    $attack15, boss_missile16 ] {boss_face();};
  126. void() boss_missile16    =[    $attack16, boss_missile17 ] {boss_face();};
  127. void() boss_missile17    =[    $attack17, boss_missile18 ] {boss_face();};
  128. void() boss_missile18    =[    $attack18, boss_missile19 ] {boss_face();};
  129. void() boss_missile19    =[    $attack19, boss_missile20 ] {boss_face();};
  130. void() boss_missile20    =[    $attack20, boss_missile21 ] {boss_missile('100 -100 200');};
  131. void() boss_missile21    =[    $attack21, boss_missile22 ] {boss_face();};
  132. void() boss_missile22    =[    $attack22, boss_missile23 ] {boss_face();};
  133. void() boss_missile23    =[    $attack23, boss_missile1 ] {boss_face();};
  134.  
  135. void() boss_shocka1 =[    $shocka1, boss_shocka2 ] {};
  136. void() boss_shocka2 =[    $shocka2, boss_shocka3 ] {};
  137. void() boss_shocka3 =[    $shocka3, boss_shocka4 ] {};
  138. void() boss_shocka4 =[    $shocka4, boss_shocka5 ] {};
  139. void() boss_shocka5 =[    $shocka5, boss_shocka6 ] {};
  140. void() boss_shocka6 =[    $shocka6, boss_shocka7 ] {};
  141. void() boss_shocka7 =[    $shocka7, boss_shocka8 ] {};
  142. void() boss_shocka8 =[    $shocka8, boss_shocka9 ] {};
  143. void() boss_shocka9 =[    $shocka9, boss_shocka10 ] {};
  144. void() boss_shocka10 =[    $shocka10, boss_missile1 ] {};
  145.  
  146. void() boss_shockb1 =[    $shockb1, boss_shockb2 ] {};
  147. void() boss_shockb2 =[    $shockb2, boss_shockb3 ] {};
  148. void() boss_shockb3 =[    $shockb3, boss_shockb4 ] {};
  149. void() boss_shockb4 =[    $shockb4, boss_shockb5 ] {};
  150. void() boss_shockb5 =[    $shockb5, boss_shockb6 ] {};
  151. void() boss_shockb6 =[    $shockb6, boss_shockb7 ] {};
  152. void() boss_shockb7 =[    $shockb1, boss_shockb8 ] {};
  153. void() boss_shockb8 =[    $shockb2, boss_shockb9 ] {};
  154. void() boss_shockb9 =[    $shockb3, boss_shockb10 ] {};
  155. void() boss_shockb10 =[    $shockb4, boss_missile1 ] {};
  156.  
  157. void() boss_shockc1 =[    $shockc1, boss_shockc2 ] {};
  158. void() boss_shockc2 =[    $shockc2, boss_shockc3 ] {};
  159. void() boss_shockc3 =[    $shockc3, boss_shockc4 ] {};
  160. void() boss_shockc4 =[    $shockc4, boss_shockc5 ] {};
  161. void() boss_shockc5 =[    $shockc5, boss_shockc6 ] {};
  162. void() boss_shockc6 =[    $shockc6, boss_shockc7 ] {};
  163. void() boss_shockc7 =[    $shockc7, boss_shockc8 ] {};
  164. void() boss_shockc8 =[    $shockc8, boss_shockc9 ] {};
  165. void() boss_shockc9 =[    $shockc9, boss_shockc10 ] {};
  166. void() boss_shockc10 =[    $shockc10, boss_death1 ] {};
  167.  
  168. void() boss_death1 = [$death1, boss_death2] {
  169. sound (self, CHAN_VOICE, "boss1/death.wav", 1, ATTN_NORM);
  170. };
  171. void() boss_death2 = [$death2, boss_death3] {};
  172. void() boss_death3 = [$death3, boss_death4] {};
  173. void() boss_death4 = [$death4, boss_death5] {};
  174. void() boss_death5 = [$death5, boss_death6] {};
  175. void() boss_death6 = [$death6, boss_death7] {};
  176. void() boss_death7 = [$death7, boss_death8] {};
  177. void() boss_death8 = [$death8, boss_death9] {};
  178. void() boss_death9 = [$death9, boss_death10]
  179. {
  180.     sound (self, CHAN_BODY, "boss1/out1.wav", 1, ATTN_NORM);
  181.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  182.     WriteByte (MSG_BROADCAST, TE_LAVASPLASH);
  183.     WriteCoord (MSG_BROADCAST, self.origin_x);
  184.     WriteCoord (MSG_BROADCAST, self.origin_y);
  185.     WriteCoord (MSG_BROADCAST, self.origin_z);
  186. };
  187.  
  188. void() boss_death10 = [$death9, boss_death10]
  189. {
  190.     killed_monsters = killed_monsters + 1;
  191.     WriteByte (MSG_ALL, SVC_KILLEDMONSTER);    // FIXME: reliable broadcast
  192.     SUB_UseTargets ();
  193.     remove (self);
  194. };
  195.  
  196. void(vector p) boss_missile =
  197. {
  198.     local    vector    offang;
  199.     local    vector    org, vec, d;
  200.     local    float    t;
  201.  
  202.     offang = vectoangles (self.enemy.origin - self.origin);    
  203.     makevectors (offang);
  204.  
  205.     org = self.origin + p_x*v_forward + p_y*v_right + p_z*'0 0 1';
  206.     
  207. // lead the player on hard mode
  208.     if (skill > 1)
  209.     {
  210.         t = vlen(self.enemy.origin - org) / 300;
  211.         vec = self.enemy.velocity;
  212.         vec_z = 0;
  213.         d = self.enemy.origin + t * vec;        
  214.     }
  215.     else
  216.     {
  217.         d = self.enemy.origin;
  218.     }
  219.     
  220.     vec = normalize (d - org);
  221.  
  222.     launch_spike (org, vec);
  223.     setmodel (newmis, "progs/lavaball.mdl");
  224.     newmis.avelocity = '200 100 300';
  225.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);        
  226.     newmis.velocity = vec*300;
  227.     newmis.touch = T_MissileTouch; // rocket explosion
  228.     sound (self, CHAN_WEAPON, "boss1/throw.wav", 1, ATTN_NORM);
  229.  
  230. // check for dead enemy
  231.     if (self.enemy.health <= 0)
  232.         boss_idle1 ();
  233. };
  234.  
  235.  
  236. void() boss_awake =
  237. {
  238.     self.solid = SOLID_SLIDEBOX;
  239.     self.movetype = MOVETYPE_STEP;
  240.     self.takedamage = DAMAGE_NO;
  241.     
  242.     setmodel (self, "progs/boss.mdl");
  243.     setsize (self, '-128 -128 -24', '128 128 256');
  244.     
  245.     if (skill == 0)
  246.         self.health = 1;
  247.     else
  248.         self.health = 3;
  249.  
  250.     self.enemy = activator;
  251.  
  252.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  253.     WriteByte (MSG_BROADCAST, TE_LAVASPLASH);
  254.     WriteCoord (MSG_BROADCAST, self.origin_x);
  255.     WriteCoord (MSG_BROADCAST, self.origin_y);
  256.     WriteCoord (MSG_BROADCAST, self.origin_z);
  257.  
  258.     self.yaw_speed = 20;
  259.     boss_rise1 ();
  260. };
  261.  
  262.  
  263. /*QUAKED monster_boss (1 0 0) (-128 -128 -24) (128 128 256)
  264. */
  265. void() monster_boss =
  266. {
  267.     if (deathmatch && deathmatch != 3) // AXXMM
  268. //    if (deathmatch) // Original code
  269.     {
  270.         remove(self);
  271.         return;
  272.     }
  273.     precache_model ("progs/boss.mdl");
  274.     precache_model ("progs/lavaball.mdl");
  275.  
  276.     precache_sound ("weapons/rocket1i.wav");
  277.     precache_sound ("boss1/out1.wav");
  278.     precache_sound ("boss1/sight1.wav");
  279.     precache_sound ("misc/power.wav");
  280.     precache_sound ("boss1/throw.wav");
  281.     precache_sound ("boss1/pain.wav");
  282.     precache_sound ("boss1/death.wav");
  283.  
  284.     total_monsters = total_monsters + 1;
  285.  
  286.     self.use = boss_awake;
  287. };
  288.  
  289. //===========================================================================
  290.  
  291. entity    le1, le2;
  292. float    lightning_end;
  293.  
  294. void() lightning_fire =
  295. {
  296.     local vector p1, p2;
  297.     
  298.     if (time >= lightning_end)
  299.     {    // done here, put the terminals back up
  300.         self = le1;
  301.         door_go_down ();
  302.         self = le2;
  303.         door_go_down ();
  304.         return;
  305.     }
  306.     
  307.     p1 = (le1.mins + le1.maxs) * 0.5;
  308.     p1_z = le1.absmin_z - 16;
  309.     
  310.     p2 = (le2.mins + le2.maxs) * 0.5;
  311.     p2_z = le2.absmin_z - 16;
  312.     
  313.     // compensate for length of bolt
  314.     p2 = p2 - normalize(p2-p1)*100;
  315.  
  316.     self.nextthink = time + 0.1;
  317.     self.think = lightning_fire;
  318.  
  319.     WriteByte (MSG_ALL, SVC_TEMPENTITY);
  320.     WriteByte (MSG_ALL, TE_LIGHTNING3);
  321.     WriteEntity (MSG_ALL, world);
  322.     WriteCoord (MSG_ALL, p1_x);
  323.     WriteCoord (MSG_ALL, p1_y);
  324.     WriteCoord (MSG_ALL, p1_z);
  325.     WriteCoord (MSG_ALL, p2_x);
  326.     WriteCoord (MSG_ALL, p2_y);
  327.     WriteCoord (MSG_ALL, p2_z);
  328. };
  329.  
  330. void() lightning_use =
  331. {
  332.     if (lightning_end >= time + 1)
  333.         return;
  334.  
  335.     le1 = find( world, target, "lightning");
  336.     le2 = find( le1, target, "lightning");
  337.     if (!le1 || !le2)
  338.     {
  339.         dprint ("missing lightning targets\n");
  340.         return;
  341.     }
  342.     
  343.     if (
  344.      (le1.state != STATE_TOP && le1.state != STATE_BOTTOM)
  345.     || (le2.state != STATE_TOP && le2.state != STATE_BOTTOM)
  346.     || (le1.state != le2.state) )
  347.     {
  348. //        dprint ("not aligned\n");
  349.         return;
  350.     }
  351.  
  352. // don't let the electrodes go back up until the bolt is done
  353.     le1.nextthink = -1;
  354.     le2.nextthink = -1;
  355.     lightning_end = time + 1;
  356.  
  357.     sound (self, CHAN_VOICE, "misc/power.wav", 1, ATTN_NORM);
  358.     lightning_fire ();        
  359.  
  360. // advance the boss pain if down
  361.     self = find (world, classname, "monster_boss");
  362.     if (!self)
  363.         return;
  364.     self.enemy = activator;
  365.     if (le1.state == STATE_TOP && self.health > 0)
  366.     {
  367.         sound (self, CHAN_VOICE, "boss1/pain.wav", 1, ATTN_NORM);
  368.         self.health = self.health - 1;
  369.         if (self.health >= 2)
  370.             boss_shocka1();
  371.         else if (self.health == 1)
  372.             boss_shockb1();
  373.         else if (self.health == 0)
  374.             boss_shockc1();
  375.     }    
  376. };
  377.  
  378.  
  379. /*QUAKED event_lightning (0 1 1) (-16 -16 -16) (16 16 16)
  380. Just for boss level.
  381. */
  382. void() event_lightning =
  383. {
  384.     self.use = lightning_use;
  385. };
  386.  
  387.  
  388.